既存のAWS OrganizationsリソースをTerraformで管理してみた
既存のAWS OrganizationsをTerraformで管理したいことがありました。
このブログでは、以下のリソースをTerraformにimportしてみます。
前提
TerraformとProviderのバージョンは以下を使用しました。
- Terraform: 1.9.0
- AWS Provider: 5.56.1
今回は-generate-config-out
オプションでHCLを自動生成しているため、Terraform Versionは1.5.0以上が必要です。
やってみた
AWS Organizationsをimport
以下のファイルを用意します。
import {
id = "o-XXXXX" # 置き換える
to = aws_organizations_organization.this
}
-generate-config-out
でHCLを自動生成します。
terraform init
terraform plan -generate-config-out=organizations.tf
私の環境では以下のファイルが作成されました。
resource "aws_organizations_organization" "this" {
aws_service_access_principals = ["account.amazonaws.com", "backup.amazonaws.com", "cloudtrail.amazonaws.com", "config.amazonaws.com", "controltower.amazonaws.com", "guardduty.amazonaws.com", "member.org.stacksets.cloudformation.amazonaws.com", "sso.amazonaws.com"]
enabled_policy_types = ["BACKUP_POLICY", "SERVICE_CONTROL_POLICY", "TAG_POLICY"]
feature_set = "ALL"
}
Applyして内容を取り込みます。
terraform apply
AWS Organizations OUをimport
続いてOUを同様の手順でimportします。
import {
to = aws_organizations_organizational_unit.sandbox
id = "ou-XXXXXXX" # 置き換える
}
# 既存環境のOU分定義
terraform plan -generate-config-out=organizations_unit.tf
以下のファイルが生成されました。
resource "aws_organizations_organizational_unit" "sandbox" {
name = "SandboxOU"
parent_id = "r-XXXXX"
tags = {}
tags_all = {}
}
Applyします。
terraform apply
AWSアカウントをimport
続いてAWSアカウントです。
import {
to = aws_organizations_account.sandbox1
id = "123456789012"
}
# 既存環境のAWSアカウント分定義
terraform plan -generate-config-out=organizations_account.tf
以下のファイルが生成されました。
resource "aws_organizations_account" "sandbox1" {
close_on_deletion = null
create_govcloud = null
email = "xxxx@example.com"
iam_user_access_to_billing = null
name = "Sandbox 1"
parent_id = "ou-XXXXXX"
role_name = null
tags = {}
tags_all = {}
}
close_on_deletion
やcreate_govcloud
などnullが入っている引数は消してしまっても問題ありません。
私は以下のようにしました。tags
とtags_all
はつけているアカウントもあるので、残していますが消しても問題有りません。
resource "aws_organizations_account" "sandbox1" {
email = "xxxx@example.com"
name = "Sandbox 1"
parent_id = "ou-XXXXXX"
tags = {}
tags_all = {}
}
Applyします。
terraform apply
TerraformでAWS Organizations関連のリソースを操作してみる
AWSアカウントを別のOUに移動してみます。
resource "aws_organizations_account" "sandbox1" {
email = "xxxx@example.com"
name = "Sandbox 1"
# OU IDを変更
+ parent_id = "ou-YYYYY"
- parent_id = "ou-XXXXXX"
tags = {}
tags_all = {}
}
Terraformで差分を確認すると、以下の通りparent_id
変更後OUに変わりました。
terraform plan
# 変更箇所を抜粋
Terraform will perform the following actions:
# aws_organizations_account.sandbox1 will be updated in-place
~ resource "aws_organizations_account" "sandbox1" {
+ close_on_deletion = false
+ create_govcloud = false
id = "12345678901"
name = "Sandbox 1"
~ parent_id = "ou-XXXXXX" -> "ou-YYYYYY"
tags = {}
# (6 unchanged attributes hidden)
}
Plan: 0 to add, 1 to change, 0 to destroy.
applyして変更を適用します。
terraform apply
問題なくTerraformで操作できることを確認できました。
おわりに
AWS Organizations関連のリソースのimportをやってみました。
-generate-config-out
便利ですね。import以外の部分はほぼ自動生成でできました。
AWS Organizations関連のリソースには、よく使われるものとしてはSCP(organizations_policy)が上げられる思います。
同様の手順で実行出来ますので、必要に応じて試してみてください。
以上、AWS事業本部の佐藤(@chari7311)でした。